package oppo

import (
	"dta-apk/global"
	"dta-apk/model"
	"dta-apk/utils"
	"encoding/json"
	"fmt"
	"log"
	"net/url"
)

// 获取token
func accessToken() string {
	params := map[string]string{
		"client_id":     global.Config.App.Oppo.ClientId,
		"client_secret": global.Config.App.Oppo.ClientSecret,
	}
	result := utils.GetQuery(getUrl(api_token), params)
	// 解析结构
	var data map[string]interface{}
	err := json.Unmarshal([]byte(result), &data)
	if err != nil {
		fmt.Println("解析 JSON 失败:", err)
		return ""
	}
	errno := data["errno"]
	if errno.(float64) == 0 {
		token_data := data["data"].(map[string]interface{})
		return token_data["access_token"].(string)
	}

	return ""
}

/*
获取应用详情
packageName: 包名  必传
versionCode：版本号 非必传
*/
func GetAppDetails(packageName, versionCode string) (*AppInfo, bool) {
	// 公共参数
	paramMap := getCommonParam()
	// 业务参数
	paramMap["pkg_name"] = url.QueryEscape(packageName)
	// 版本号
	if versionCode != "" {
		paramMap["version_code"] = url.QueryEscape(versionCode)
	}
	// 生成签名
	sign(&paramMap, global.Config.App.Oppo.ClientSecret)
	// 请求应用详情
	result := utils.GetQueryHeaders(getUrl(api_app_info), paramMap, getHeaders())
	utils.Info("获取Oppo应用详细信息, 详情：%v", result)
	// 结果处理
	var appInfoResult AppInfoResult
	error := json.Unmarshal([]byte(result), &appInfoResult)
	if error == nil {
		if appInfoResult.Errno == 0 {
			return &appInfoResult.Data, true
		}
	}

	return nil, false
}

// 更新应用资料
func UpdateAppInfo(updateInfo OppoUpdateInfo) {
	// 公共参数
	commonParam := getCommonParam()
	// 业务请求参数
	requestParam := utils.StructToStringMap(updateInfo)
	// 合并参数
	param := utils.MergeStringMap(commonParam, requestParam)
	// 生成签名
	sign(&param, global.Config.App.Oppo.ClientSecret)
	// 更新资料请求
	fmt.Println(param)
	result := utils.PostBodyHeader(getUrl(api_app_info_update), param, getHeaders())
	fmt.Println(result)
}

// 获取上传文件配置
func getUploadConfig() (bool, *UploadConfigInfo) {
	// 公共参数
	commonParam := getCommonParam()
	// 生成签名
	sign(&commonParam, global.Config.App.Oppo.ClientSecret)
	// 请求结果
	result := utils.GetQueryHeaders(getUrl(api_file_upload), commonParam, getHeaders())
	// 数据处理
	var uploadConfig UploadConfigResult
	errno := json.Unmarshal([]byte(result), &uploadConfig)
	if errno != nil {
		return false, nil
	}
	if uploadConfig.Errno != 0 {
		return false, nil
	}

	return true, &uploadConfig.Data
}

/*
文件上传

参数filePath：文件路径
参数fileType：文件类型 photo、apk、resource
*/
func UploadFile(filePath, fileType, version string) (bool, *UploadInfo) {
	// 先查询是否已经上传过apk文件
	apkBelong := "oppo_apk_" + version
	var apkFile model.FileModel
	apkIse := model.FindOne(&apkFile, &model.FileModel{Belong: apkBelong})
	if apkIse {
		return true, &UploadInfo{
			Url: apkFile.Path,
			Md5: apkFile.Md5,
		}
	}

	// 请求上传文件的配置
	configResult, uploadConfig := getUploadConfig()
	if !configResult {
		log.Println("oppo文件上传配置获取失败")
		return false, nil
	}

	// 文件上传参数
	uploadSubParam := map[string]string{
		"type": fileType,
		"sign": uploadConfig.Sign,
	}
	// 公共参数
	commonParam := getCommonParam()
	// 合并参数
	uploadParam := utils.MergeStringMap(commonParam, uploadSubParam)
	// 生成签名
	sign(&uploadParam, global.Config.App.Oppo.ClientSecret)
	// 文件上传
	result := utils.PostFormFileHeader(uploadConfig.UploadUrl, uploadParam, getHeaders(), "file", filePath)
	// 数据处理
	var uploadObj UploadResult
	errno := json.Unmarshal([]byte(result), &uploadObj)
	if errno == nil {
		if uploadObj.Errno == 0 {
			// 上传成功后，保存上传地址
			fileData := model.FileModel{
				Path:   uploadObj.Data.Url,
				Type:   "oppo_apk",
				Belong: apkBelong,
				Md5:    uploadObj.Data.Md5,
			}
			model.Save(&fileData)
			return true, &uploadObj.Data
		}

	}
	return false, nil

}

// 应用版本升级审核
func UpdateApk(packageName, filePath, versionCode, updateDesc, onlineType string) (bool, string) {
	upResult, upObj := UploadFile(filePath, "apk", versionCode)
	if !upResult {
		return false, fmt.Sprintf("%v", "文件上传失败")
	}
	utils.Info("获取文件上传的配置信息")
	// 获取应用详情
	appInfo, infoResult := GetAppDetails(packageName, "")
	if !infoResult {
		return false, "应用详情获取失败"
	}
	// 公共参数
	commonParam := getCommonParam()
	// apk参数
	apk := apkInfo{
		Url:     upObj.Url,
		Md5:     upObj.Md5,
		CpuCode: "0",
	}
	var apkInfos []apkInfo
	apkInfos = append(apkInfos, apk)
	jsonByte, _ := json.Marshal(apkInfos)
	// 更新参数
	updateApk := OppoUpdateApk{
		PkgName:           appInfo.PkgName,
		VersionCode:       versionCode,
		ApkUrl:            string(jsonByte),
		AppName:           appInfo.AppName,
		SecondCategoryId:  appInfo.SecondCategoryId,
		ThirdCategoryId:   appInfo.ThirdCategoryId,
		Summary:           appInfo.Summary,
		DetailDesc:        appInfo.DetailDesc,
		UpdateDesc:        updateDesc,
		PrivacySourceUrl:  appInfo.PrivacySourceUrl,
		IconUrl:           appInfo.IconUrl,
		PicUrl:            appInfo.PicUrl,
		OnlineType:        onlineType, // 发布类型，1-审核立即发布；2-定时发布
		TestDesc:          "无",
		CopyrightUrl:      appInfo.CopyrightUrl,
		BusinessUsername:  appInfo.BusinessUsername,
		BusinessEmail:     appInfo.BusinessEmail,
		BusinessMobile:    appInfo.BusinessMobile,
		AgeLevel:          appInfo.AgeLevel,
		AdaptiveEquipment: appInfo.AdaptiveEquipment,
	}
	// 合并参数
	updateParam := utils.MergeStringMap(commonParam, utils.StructToStringMap(updateApk))
	fmt.Println("========================================")
	fmt.Println(updateParam)
	fmt.Println("========================================")
	// 生成签名
	sign(&updateParam, global.Config.App.Oppo.ClientSecret)
	// 发起请求
	result := utils.PostFormHeader(getUrl(api_app_update), updateParam, getHeaders())
	utils.Info("提交版本升级审核信息, 结果：%s", result)
	// 处理结果
	var updResult UpdateApkResult
	errno := json.Unmarshal([]byte(result), &updResult)
	if errno != nil {
		return false, "应用版本升级审核失败"
	}

	if updResult.Errno != 0 {
		return false, "应用版本升级审核失败"
	}

	resultData := updResult.Data

	if !resultData.Success {
		return false, resultData.Message
	}

	return true, "应用版本升级审核提交成功"

}
